(* ===================================================================== *)
(** bopbdd : synthese de circuits combinatoires a partir de fonction a output
    multiple etant donnee une table de verite partielle (avec bits don't care)
    @author Mathieu Barbin *)
(* ===================================================================== *)

(** Selon l'utilisation -t (-tree) ou par defaut, list avec partage *)

open Bplib
open Bopbddtools

let version = "1.0"

(* ===================================================================== *)
(** Lecture des arguments systemes *)
(* ===================================================================== *)
let args_assoc = assoc_of_sys_argv Sys.argv
let get_arg_int_value = try_get_arg_int_value args_assoc
let get_arg_string_value = try_get_arg_string_value args_assoc
(* ===================================================================== *)

let _ =
  let args = Array.to_list Sys.argv in
  Printf.fprintf stderr "This is bopbdd @beboptools, version %s\n" version;
  (* Determiner si on est dans le cas de l'option -tree *)
  let tree_option = List.exists (fun t -> t = "-tree" || t = "-t") args in
  (* Le decoupage, et le fichier memoire ascii source *)
  let adresse = get_arg_int_value "-AD" in
  let word = get_arg_int_value "-WL" in
  let file = get_arg_string_value "-f" in
  (* On produit sur stdout ou dans un fichier *)
  if List.mem "-o" args
  then
    let oc = open_out (get_arg_string_value "-o") in
    let print = Printf.fprintf oc "%s" in
    begin
      if tree_option
      then print_raw_tree_of_file print adresse word file
      else print_raw_list_of_file print adresse word file 
      ;
      flush oc;
      close_out oc
    end
  else
    if tree_option 
    then
      begin
	print_raw_tree_of_file print_string adresse word file;
	flush stdout
      end
    else
      begin
	print_raw_list_of_file print_string adresse word file;
	flush stdout
      end
  ;
  Printf.fprintf stderr "Processor time used : %f\n" (Sys.time ());
  flush stderr
   
